package study.java.jdk.jdk8._1_stream.sort;

import lombok.extern.slf4j.Slf4j;
import org.junit.Before;
import org.junit.Test;

import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;

//HashMap是无序的，当我们希望有顺序地去存储key-value时，就需要使用LinkedHashMap了，排序后可以再转成HashMap。
//LinkedHashMap是继承于HashMap，是基于HashMap和双向链表来实现的。
//LinkedHashMap是线程不安全的。
@Slf4j
public class sorted_Map_Test {

    Map<String, String> src;

    @Before
    public void init() {
        src = new HashMap<>();
        src.put("a", "123");
        src.put("b", "456");
        src.put("z", "789");
        src.put("c", "234");
    }

    /**
     * 根据 value 正序排序（↑）
     */
    @Test
    public void test1() {
        Map<String, String> dest = new LinkedHashMap<>();
        src.entrySet().stream()
                .sorted(Comparator.comparing(Map.Entry::getValue))
                .forEach(x -> dest.put(x.getKey(), x.getValue()));
        log.info("{}", dest);
    }

    /**
     * 根据 value 倒序排序（↓）
     */
    @Test
    public void test2() {
        Map<String, String> dest = new LinkedHashMap<>();
        src.entrySet().stream()
                .sorted(Collections.reverseOrder(Map.Entry.comparingByValue()))
                .forEach(x -> dest.put(x.getKey(), x.getValue()));
        log.info("{}", dest);
    }

    /**
     * 根据 key 正序排序（↑）
     */
    @Test
    public void test3() {
        Map<String, String> dest = new LinkedHashMap<>();
        src.entrySet().stream()
                .sorted(Comparator.comparing(e -> e.getKey()))
                .forEach(x -> dest.put(x.getKey(), x.getValue()));
        log.info("{}", dest);
    }

    /**
     * 根据 key 倒序排序（↓）
     */
    @Test
    public void test4() {
        Map<String, String> dest = new LinkedHashMap<>();
        src.entrySet().stream()
                .sorted(Collections.reverseOrder(Map.Entry.comparingByKey()))
                .forEach(x -> dest.put(x.getKey(), x.getValue()));
        log.info("{}", dest);
    }
}
